package leecode;

/**
 * 题目：两数相加，链表题
 * //题目：给你两个非空的链表，表示两个非负的整数。它们每位数字都是按照逆序的方式存储的，并且每个节点只能存储一位数字。
 * //      请你将两个数相加，并以相同形式返回一个表示和的链表。
 * //      你可以假设除了数字 0 之外，这两个数都不会以 0开头。
 */


// 要让两个列表的长度相等，链表头是低位，链表尾部是高位



public class Solution_2 {
    public class ListNode {
        int val;
        ListNode next;

        ListNode() {
        }

        ListNode(int val) {
            this.val = val;
        }

        ListNode(int val, ListNode next) {
            this.val = val;
            this.next = next;
        }
    }

    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        // 新建两个链表
        ListNode head = null, tail = null;
        // 设置进位
        int carry = 0;

        // 循环，当有一个链表还没遍历完就需要进行操作
        while (l1 != null || l2 != null) {
            // 取出两个操作数，从表头逐个取，null就补零
            int n1 = (l1 != null ? l1.val : 0);
            int n2 = (l2 != null ? l2.val : 0);
            int sum = n1 + n2 + carry;

            // 使用新建链表来保存结果，head表示链表头，tail表示链表尾部
            if (head == null) {
                head = tail = new ListNode(sum % 10);
            } else {
                tail.next = new ListNode(sum % 10);
                tail = tail.next;
            }
            carry = sum / 10;
            if (l1 != null) {
                l1 = l1.next;
            }
            if (l2 != null) {
                l2 = l2.next;
            }
        }

        // 最后仍有进位，对结果进行追加
        if (carry > 0) {
            tail.next = new ListNode(carry);
        }
        return head;
    }
}